package cc.messcat.dao.fupin;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import cc.messcat.common.dao.BaseDaoImpl;
import cc.messcat.common.model.Pager;
import cc.messcat.dao.area.AreaDao;
import cc.messcat.entity.area.Area;
import cc.messcat.entity.fupin.Family;
import cc.messcat.entity.fupin.FamilyHistory;
import cc.messcat.entity.system.McUser;
import cc.messcat.util.GainDataUtil;
import cc.messcat.util.SqlStatisUtil;

@Repository("familyDao")
public class FamilyDaoImpl extends BaseDaoImpl<Family>implements FamilyDao {

	@Autowired
	private AreaDao areaDao;

	/**
	 * 劳动技能类型统计
	 */
	@Override
	public Pager laborTypeStatistics(McUser user, Integer pageNo, Integer pageSize, String year, String country,
			String village, String poverty) {
		// 搜索条件
		// 如果没有设置乡镇，默认县下所有乡镇
		String areaCondition = "130434000000";
		boolean isCounty = true;
		// 如果有，验证权限，镇级以上，则查询该镇下所有村
		if (user.getUserLevel().getLevel() < 4 && StringUtils.isNotBlank(country)) {
			areaCondition = country.trim();
			isCounty = false;
		}
		// 如果镇级，则当前用户所在镇下所有村
		if (user.getUserLevel().getLevel() == 4) {
			Area area = user.getArea();
			areaCondition = areaCondition == null ? "none" : area.getAreaCode().trim();
			isCounty = false;
		}

		String hql = "select new Map(" + " f.labour as labor,count(*) as count) " + " from Family as f,PoorFamily as p "
				+ "where f.isDel=0 and p.isDel=0 and p.attribute!='一般农户' and f.fid is not null and f.fid = p.id and f.annual=p.annual "
				+ (StringUtils.isNotBlank(poverty) ? " and  p.poverty = '" + poverty + "'" : "")
				+ (StringUtils.isNotBlank(year) ? " and f.annual='" + year.trim() + "'" : "");

		String grade = "select new Map(a.id as id, a.area as area, a.areaCode as areaCode) "
				+ " from Area as a where a.fatherId = (select a.id from Area as a where a.areaCode = '" + areaCondition
				+ "') order by areaCode";

		// 村级
		if (user.getUserLevel().getLevel() == 5) {
			Area area = user.getArea();
			areaCondition = areaCondition == null ? "none" : area.getAreaCode().trim();
			// 重置地区
			grade = "select new Map(a.id as id, a.area as area, a.areaCode as areaCode) from Area as a where a.areaCode ='"
					+ areaCondition + "'";
		}

		Map<String, Object> verbose = null;
		Map<String, Object> typeVerbose = null;
		List laborTypeCount = new ArrayList<>();
		List list = new ArrayList<>();
		Long count = 0L;
		String areaCode = "";
		NumberFormat formatter = NumberFormat.getPercentInstance();
		formatter.setMinimumFractionDigits(2);
		
		Map<String,String> fill = new HashMap<>();
		fill.put("count", "0");
		fill.put("percentage", "0%");
		for (Map e : (List<Map>) findPageObjects(grade, pageNo, pageSize, new HashMap<>())) {

			// 县级查询则统计镇，镇级查询则统计村
			areaCode = isCounty && e.get("areaCode").toString().trim().length() > 8
					? e.get("areaCode").toString().trim().substring(0, 9) + "%" : e.get("areaCode").toString().trim();
			// 劳动技能类型统计结果
			laborTypeCount = find(hql + " and p.area.areaCode like '" + areaCode + "' group by f.labour");
			// 该地区贫困人口统计结果
			count = (Long) find(
					"select count(1) from Family as f,PoorFamily as p where f.fid = p.id and f.isDel=0 and p.isDel=0 and f.annual=p.annual and p.attribute!='一般农户' and p.area.areaCode like '"
							+ areaCode + "'"
							+ ((StringUtils.isNotBlank(poverty)) ? " and  p.poverty = '" + poverty + "'" : "")
							+ (StringUtils.isNotBlank(year) ? " and f.annual='" + year.trim() + "'" : "")).get(0);

			verbose = new HashMap<>();
			verbose.put("area", e.get("area").toString().trim());
			
			verbose.put("total", count);
			verbose.put("pt", fill);
			verbose.put("w", fill);
			verbose.put("jn", fill);
			verbose.put("ss", fill);

			for (Map o : (List<Map>) laborTypeCount) {
				typeVerbose = new HashMap<>();
				typeVerbose.put("count", o.get("count"));
				typeVerbose.put("percentage", formatter.format((Long) o.get("count") / Double.valueOf(count)));
				switch (StringUtils.isBlank((String) o.get("labor")) ? "others" : o.get("labor").toString().trim()) {
				case "普通劳动力":
					verbose.put("pt", typeVerbose);
					break;
				case "无劳动力":
					verbose.put("w", typeVerbose);
					break;
				case "技能劳动力":
					verbose.put("jn", typeVerbose);
					break;
				case "丧失劳动力":
					verbose.put("ss", typeVerbose);
					break;
				case "others":
					verbose.put("others", typeVerbose);
				}
			}
			list.add(verbose);
		}

		return new Pager(pageSize, pageNo, queryList(grade, null).size(), list);
	}

	/**
	 * 统计身体健康
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public Pager popuHealthyStatisPager(Integer pageNo, Integer pageSize, McUser user, String year, String country,
			String village, String poverty) {
		/*
		 * private String name;//用户等级名称：系统、省、市、县、乡镇、村 private Integer
		 * level;//等级值：0/1/2/3/4/5
		 */
		// 判断系统用户的等级权限（默认查询所有乡镇）
		Long fatherId = null;// 地区父Id
		// 村级使用
		Long areaId = null;
		String sqlCondition = " AND a1.id = a.ID ";// 村条件
		// 1.等级为‘系统、省、市、县’等级的可以自由查询(不选country)
		if (user.getUserLevel().getLevel() < 4 && StringUtils.isBlank(country)) {
			fatherId = 3L;// 乡镇地区父Id
			sqlCondition = " AND a1.fatherId = a.ID";// 乡镇条件
		} // 2.等级为‘系统、省、市、县’等级的可以自由查询(有选country)
		else if (user.getUserLevel().getLevel() < 4 && StringUtils.isNotBlank(country)) {
			// 通过前端地区编码查询对应的地区
			Area area = areaDao.getAreaByCode(country);
			// 获取某乡镇下ID
			fatherId = area.getId();
		}
		// 3.等级为 ‘乡镇级’ 的只能查询当前系统用户下的乡镇对应的所有村
		else if (user.getUserLevel().getLevel() == 4) {
			// 获取当前用户的地区ID
			fatherId = user.getArea().getId();
		} // 4.等级为 ‘村级’ 的只能查看当前系统用户下的 村（自己村）
		else if (user.getUserLevel().getLevel() == 5) {
			// 获取当前用户的地区的ID
			areaId = user.getArea().getId();
		}

		// 获取sql
		StringBuffer totalCount = SqlStatisUtil.HealthyStatisSql(year, poverty, fatherId, areaId, sqlCondition);
		Query query = getCurrentSession().createSQLQuery(totalCount.toString());
		Integer rowCount = query.list().size();
		int startIndex = pageSize * (pageNo - 1);
		query.setFirstResult(startIndex); // 开始
		query.setMaxResults(pageSize); // 每页多少条
		List<Object[]> list = query.list();
		// 数据处理
		List<Object> dataList = GainDataUtil.HealthyStatisData(list);
		return new Pager(pageSize, pageNo, rowCount, dataList);

	}

	/**
	 * 贫困户文化程度统计
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Override
	public Pager popuCultureStatisPager(Integer pageNo, Integer pageSize, McUser user, String year, String country,
			String village, String poverty) {

		Long fatherId = null;// 地区父Id
		// 村级使用
		Long areaId = null;
		String sqlCondition = " AND a1.id = a.ID ";// 村条件
		// 1.等级为‘系统、省、市、县’等级的可以自由查询(不选country)
		if (user.getUserLevel().getLevel() < 4 && StringUtils.isBlank(country)) {
			fatherId = 3L;// 乡镇地区父Id
			sqlCondition = " AND a1.fatherId = a.ID";// 乡镇条件
		} // 2.等级为‘系统、省、市、县’等级的可以自由查询(有选country)
		else if (user.getUserLevel().getLevel() < 4 && StringUtils.isNotBlank(country)) {
			// 通过前端地区编码查询对应的地区
			Area area = areaDao.getAreaByCode(country);
			// 获取某乡镇下ID
			fatherId = area.getId();
		}
		// 3.等级为 ‘乡镇级’ 的只能查询当前系统用户下的乡镇对应的所有村
		else if (user.getUserLevel().getLevel() == 4) {
			// 获取当前用户的地区ID
			fatherId = user.getArea().getId();
		} // 4.等级为 ‘村级’ 的只能查看当前系统用户下的 村（自己村）
		else if (user.getUserLevel().getLevel() == 5) {
			// 获取当前用户的地区的ID
			areaId = user.getArea().getId();
		}
		// 获取sql
		StringBuffer totalCount = SqlStatisUtil.CultureStatisSql(year, poverty, fatherId, areaId, sqlCondition);
		Query query = getCurrentSession().createSQLQuery(totalCount.toString());
		Integer rowCount = query.list().size();
		int startIndex = pageSize * (pageNo - 1);
		query.setFirstResult(startIndex); // 开始
		query.setMaxResults(pageSize); // 每页多少条
		List<Object[]> list = query.list();
		// 数据处理
		List<Object> dataList = GainDataUtil.CultureStatisData(list);
		return new Pager(pageSize, pageNo, rowCount, dataList);
	}

	/**
	 * 贫困户生产生活条件困难情况统计
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public Pager ductionLifeStatisPager(Integer pageNo, Integer pageSize, McUser user, String year, String country,
			String village, String poverty) {
		Long fatherId = null;// 地区父Id
		// 村级使用
		Long areaId = null;
		String sqlCondition = " AND a1.id = a.ID ";// 村条件
		// 1.等级为‘系统、省、市、县’等级的可以自由查询(不选country)
		if (user.getUserLevel().getLevel() < 4 && StringUtils.isBlank(country)) {
			fatherId = 3L;// 乡镇地区父Id
			sqlCondition = " AND a1.fatherId = a.ID";// 乡镇条件
		} // 2.等级为‘系统、省、市、县’等级的可以自由查询(有选country)
		else if (user.getUserLevel().getLevel() < 4 && StringUtils.isNotBlank(country)) {
			// 通过前端地区编码查询对应的地区
			Area area = areaDao.getAreaByCode(country);
			// 获取某乡镇下ID
			fatherId = area.getId();
		}
		// 3.等级为 ‘乡镇级’ 的只能查询当前系统用户下的乡镇对应的所有村
		else if (user.getUserLevel().getLevel() == 4) {
			// 获取当前用户的地区ID
			fatherId = user.getArea().getId();
		} // 4.等级为 ‘村级’ 的只能查看当前系统用户下的 村（自己村）
		else if (user.getUserLevel().getLevel() == 5) {
			// 获取当前用户的地区的ID
			areaId = user.getArea().getId();
		}
		// 获取sql
		StringBuffer totalCount = SqlStatisUtil.DuctionLifeStatisSql(year, poverty, fatherId, areaId, sqlCondition);
		Query query = getCurrentSession().createSQLQuery(totalCount.toString());
		Integer rowCount = query.list().size();
		int startIndex = pageSize * (pageNo - 1);
		query.setFirstResult(startIndex); // 开始
		query.setMaxResults(pageSize); // 每页多少条
		List<Object[]> list = query.list();
		// 数据处理
		List<Object> dataList = GainDataUtil.DuctionLifeStatisData(list);
		return new Pager(pageSize, pageNo, rowCount, dataList);
	}

	/**
	 * 贫困户土地资源情况统计
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public Pager landResourceStatisPager(Integer pageNo, Integer pageSize, McUser user, String year, String country,
			String village, String poverty) {
		Long fatherId = null;// 地区父Id
		// 村级使用
		Long areaId = null;
		String sqlCondition = " AND a1.id = a.ID ";// 村条件
		// 1.等级为‘系统、省、市、县’等级的可以自由查询(不选country)
		if (user.getUserLevel().getLevel() < 4 && StringUtils.isBlank(country)) {
			fatherId = 3L;// 乡镇地区父Id
			sqlCondition = " AND a1.fatherId = a.ID";// 乡镇条件
		} // 2.等级为‘系统、省、市、县’等级的可以自由查询(有选country)
		else if (user.getUserLevel().getLevel() < 4 && StringUtils.isNotBlank(country)) {
			// 通过前端地区编码查询对应的地区
			Area area = areaDao.getAreaByCode(country);
			// 获取某乡镇下ID
			fatherId = area.getId();
		}
		// 3.等级为 ‘乡镇级’ 的只能查询当前系统用户下的乡镇对应的所有村
		else if (user.getUserLevel().getLevel() == 4) {
			// 获取当前用户的地区ID
			fatherId = user.getArea().getId();
		} // 4.等级为 ‘村级’ 的只能查看当前系统用户下的 村（自己村）
		else if (user.getUserLevel().getLevel() == 5) {
			// 获取当前用户的地区的ID
			areaId = user.getArea().getId();
		}
		// 获取sql
		StringBuffer totalCount = SqlStatisUtil.LandResourceStatisSql(year, poverty, fatherId, areaId, sqlCondition);
		Query query = getCurrentSession().createSQLQuery(totalCount.toString());
		Integer rowCount = query.list().size();
		int startIndex = pageSize * (pageNo - 1);
		query.setFirstResult(startIndex); // 开始
		query.setMaxResults(pageSize); // 每页多少条
		List<Object[]> list = query.list();
		// 数据处理
		List<Object> dataList = GainDataUtil.LandResourceStatisData(list);
		return new Pager(pageSize, pageNo, rowCount, dataList);
	}

	/**
	 * 贫困户人均收入分组情况统计
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public Pager capitaIncomeStatisPager(Integer pageNo, Integer pageSize, McUser user, String year, String country,
			String village, String poverty) {
		Long fatherId = null;// 地区父Id
		// 村级使用
		Long areaId = null;
		String sqlCondition = " AND a1.id = a.ID ";// 村条件
		// 1.等级为‘系统、省、市、县’等级的可以自由查询(不选country)
		if (user.getUserLevel().getLevel() < 4 && StringUtils.isBlank(country)) {
			fatherId = 3L;// 乡镇地区父Id
			sqlCondition = " AND a1.fatherId = a.ID";// 乡镇条件
		} // 2.等级为‘系统、省、市、县’等级的可以自由查询(有选country)
		else if (user.getUserLevel().getLevel() < 4 && StringUtils.isNotBlank(country)) {
			// 通过前端地区编码查询对应的地区
			Area area = areaDao.getAreaByCode(country);
			// 获取某乡镇下ID
			fatherId = area.getId();
		}
		// 3.等级为 ‘乡镇级’ 的只能查询当前系统用户下的乡镇对应的所有村
		else if (user.getUserLevel().getLevel() == 4) {
			// 获取当前用户的地区ID
			fatherId = user.getArea().getId();
		} // 4.等级为 ‘村级’ 的只能查看当前系统用户下的 村（自己村）
		else if (user.getUserLevel().getLevel() == 5) {
			// 获取当前用户的地区的ID
			areaId = user.getArea().getId();
		}
		// 获取sql
		StringBuffer totalCount = SqlStatisUtil.CapitaIncomeStatisSql(year, poverty, fatherId, areaId, sqlCondition);
		Query query = getCurrentSession().createSQLQuery(totalCount.toString());
		Integer rowCount = query.list().size();
		int startIndex = pageSize * (pageNo - 1);
		query.setFirstResult(startIndex); // 开始
		query.setMaxResults(pageSize); // 每页多少条
		List<Object[]> list = query.list();
		// 数据处理
		List<Object> dataList = GainDataUtil.CapitaIncomeStatisData(list);

		return new Pager(pageSize, pageNo, rowCount, dataList);
	}

	/**
	 * 贫困户主要燃料分类统计表
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public Pager fuelTypeStatisPager(Integer pageNo, Integer pageSize, McUser user, String year, String country,
			String village, String poverty) {
		Long fatherId = null;// 地区父Id
		// 村级使用
		Long areaId = null;
		String sqlCondition = " AND a1.id = a.ID ";// 村条件
		// 1.等级为‘系统、省、市、县’等级的可以自由查询(不选country)
		if (user.getUserLevel().getLevel() < 4 && StringUtils.isBlank(country)) {
			fatherId = 3L;// 乡镇地区父Id
			sqlCondition = " AND a1.fatherId = a.ID";// 乡镇条件
		} // 2.等级为‘系统、省、市、县’等级的可以自由查询(有选country)
		else if (user.getUserLevel().getLevel() < 4 && StringUtils.isNotBlank(country)) {
			// 通过前端地区编码查询对应的地区
			Area area = areaDao.getAreaByCode(country);
			// 获取某乡镇下ID
			fatherId = area.getId();
		}
		// 3.等级为 ‘乡镇级’ 的只能查询当前系统用户下的乡镇对应的所有村
		else if (user.getUserLevel().getLevel() == 4) {
			// 获取当前用户的地区ID
			fatherId = user.getArea().getId();
		} // 4.等级为 ‘村级’ 的只能查看当前系统用户下的 村（自己村）
		else if (user.getUserLevel().getLevel() == 5) {
			// 获取当前用户的地区的ID
			areaId = user.getArea().getId();
		}
		// 获取sql
		StringBuffer totalCount = SqlStatisUtil.FuelTypeStatisSql(year, poverty, fatherId, areaId, sqlCondition);
		Query query = getCurrentSession().createSQLQuery(totalCount.toString());
		Integer rowCount = query.list().size();
		int startIndex = pageSize * (pageNo - 1);
		query.setFirstResult(startIndex); // 开始
		query.setMaxResults(pageSize); // 每页多少条
		List<Object[]> list = query.list();
		// 数据处理
		List<Object> dataList = GainDataUtil.ExportFuelTypeStatisData(list);
		return new Pager(pageSize, pageNo, rowCount, dataList);
	}

	/**
	 * 贫困户入户路情况分类统计表
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public Pager entranceRoadStatisPager(Integer pageNo, Integer pageSize, McUser user, String year, String country,
			String village, String poverty) {
		Long fatherId = null;// 地区父Id
		// 村级使用
		Long areaId = null;
		String sqlCondition = " AND a1.id = a.ID ";// 村条件
		// 1.等级为‘系统、省、市、县’等级的可以自由查询(不选country)
		if (user.getUserLevel().getLevel() < 4 && StringUtils.isBlank(country)) {
			fatherId = 3L;// 乡镇地区父Id
			sqlCondition = " AND a1.fatherId = a.ID";// 乡镇条件
		} // 2.等级为‘系统、省、市、县’等级的可以自由查询(有选country)
		else if (user.getUserLevel().getLevel() < 4 && StringUtils.isNotBlank(country)) {
			// 通过前端地区编码查询对应的地区
			Area area = areaDao.getAreaByCode(country);
			// 获取某乡镇下ID
			fatherId = area.getId();
		}
		// 3.等级为 ‘乡镇级’ 的只能查询当前系统用户下的乡镇对应的所有村
		else if (user.getUserLevel().getLevel() == 4) {
			// 获取当前用户的地区ID
			fatherId = user.getArea().getId();
		} // 4.等级为 ‘村级’ 的只能查看当前系统用户下的 村（自己村）
		else if (user.getUserLevel().getLevel() == 5) {
			// 获取当前用户的地区的ID
			areaId = user.getArea().getId();
		}
		// 获取sql
		StringBuffer totalCount = SqlStatisUtil.EntranceRoadStatisSql(year, poverty, fatherId, areaId, sqlCondition);
		Query query = getCurrentSession().createSQLQuery(totalCount.toString());
		Integer rowCount = query.list().size();
		int startIndex = pageSize * (pageNo - 1);
		query.setFirstResult(startIndex); // 开始
		query.setMaxResults(pageSize); // 每页多少条
		List<Object[]> list = query.list();
		// 数据处理
		List<Object> dataList = GainDataUtil.ExportEntranceRoadStatisData(list);
		return new Pager(pageSize, pageNo, rowCount, dataList);
	}

	/**
	 * 贫困户家庭收入情况统计表
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public Pager familyIncomeStatisPager(Integer pageNo, Integer pageSize, McUser user, String year, String country,
			String village, String poverty) {
		Long fatherId = null;// 地区父Id
		// 村级使用
		Long areaId = null;
		String sqlCondition = " AND a1.id = a.ID ";// 村条件
		// 1.等级为‘系统、省、市、县’等级的可以自由查询(不选country)
		if (user.getUserLevel().getLevel() < 4 && StringUtils.isBlank(country)) {
			fatherId = 3L;// 乡镇地区父Id
			sqlCondition = " AND a1.fatherId = a.ID";// 乡镇条件
		} // 2.等级为‘系统、省、市、县’等级的可以自由查询(有选country)
		else if (user.getUserLevel().getLevel() < 4 && StringUtils.isNotBlank(country)) {
			// 通过前端地区编码查询对应的地区
			Area area = areaDao.getAreaByCode(country);
			// 获取某乡镇下ID
			fatherId = area.getId();
		}
		// 3.等级为 ‘乡镇级’ 的只能查询当前系统用户下的乡镇对应的所有村
		else if (user.getUserLevel().getLevel() == 4) {
			// 获取当前用户的地区ID
			fatherId = user.getArea().getId();
		} // 4.等级为 ‘村级’ 的只能查看当前系统用户下的 村（自己村）
		else if (user.getUserLevel().getLevel() == 5) {
			// 获取当前用户的地区的ID
			areaId = user.getArea().getId();
		}
		// 获取sql
		StringBuffer totalCount = SqlStatisUtil.FamilyIncomeStatisSql(year, poverty, fatherId, areaId, sqlCondition);
		Query query = getCurrentSession().createSQLQuery(totalCount.toString());
		Integer rowCount = query.list().size();
		int startIndex = pageSize * (pageNo - 1);
		query.setFirstResult(startIndex); // 开始
		query.setMaxResults(pageSize); // 每页多少条
		List<Object[]> list = query.list();
		// 数据处理
		List<Object> dataList = GainDataUtil.ExportFamilyIncomeStatisData(list);
		return new Pager(pageSize, pageNo, rowCount, dataList);
	}

	/**
	 * 贫困户转移性收入构成情况统计表
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public Pager transferableIncStatisPager(Integer pageNo, Integer pageSize, McUser user, String year, String country,
			String village, String poverty) {
		Long fatherId = null;// 地区父Id
		// 村级使用
		Long areaId = null;
		String sqlCondition = " AND a1.id = a.ID ";// 村条件
		// 1.等级为‘系统、省、市、县’等级的可以自由查询(不选country)
		if (user.getUserLevel().getLevel() < 4 && StringUtils.isBlank(country)) {
			fatherId = 3L;// 乡镇地区父Id
			sqlCondition = " AND a1.fatherId = a.ID";// 乡镇条件
		} // 2.等级为‘系统、省、市、县’等级的可以自由查询(有选country)
		else if (user.getUserLevel().getLevel() < 4 && StringUtils.isNotBlank(country)) {
			// 通过前端地区编码查询对应的地区
			Area area = areaDao.getAreaByCode(country);
			// 获取某乡镇下ID
			fatherId = area.getId();
		}
		// 3.等级为 ‘乡镇级’ 的只能查询当前系统用户下的乡镇对应的所有村
		else if (user.getUserLevel().getLevel() == 4) {
			// 获取当前用户的地区ID
			fatherId = user.getArea().getId();
		} // 4.等级为 ‘村级’ 的只能查看当前系统用户下的 村（自己村）
		else if (user.getUserLevel().getLevel() == 5) {
			// 获取当前用户的地区的ID
			areaId = user.getArea().getId();
		}
		// 获取sql
		StringBuffer totalCount = SqlStatisUtil.TransferableIncStatisSql(year, poverty, fatherId, areaId, sqlCondition);
		Query query = getCurrentSession().createSQLQuery(totalCount.toString());
		Integer rowCount = query.list().size();
		int startIndex = pageSize * (pageNo - 1);
		query.setFirstResult(startIndex); // 开始
		query.setMaxResults(pageSize); // 每页多少条
		List<Object[]> list = query.list();
		// 数据处理
		List<Object> dataList = GainDataUtil.TransferableIncStatisData(list);
		return new Pager(pageSize, pageNo, rowCount, dataList);
	}

	@Override
	public void modifyObject2(Family family) {
		getCurrentSession().merge(family);
		
	}

	@Override
	public Long addFamily(Family family) {
		
		return (Long) getCurrentSession().save(family);
	}

	@Override
	public void delFamilyPfId(List<Long>  id) {
		/*String hql  = "delete from Family where fid=:fid";
		Query query = getCurrentSession().createQuery(hql);
		query.setParameter("fid", id);
		query.executeUpdate();*/
		
		
//	    String[] ids = {"1","2","3"};
        String  hql=  "delete from Family where fid  in  (:fid)"; 
    	Query query = getCurrentSession().createQuery(hql);
        query.setParameterList("fid", id).executeUpdate();
		
		
	}

	/**
	 * 添加家庭成员变更历史
	 * @param familyHistory
	 * @return
	 */
	@Override
	public Long addFamilyHistory(FamilyHistory familyHistory) {
		return (Long) getCurrentSession().save(familyHistory);
	}

	@Override
	public void merge(Family f) {
		getCurrentSession().merge(f);
	}

	@Override
	public Family findRelationByFid(Long pfId) {
		List<Family> list = this.getCurrentSession().createQuery(" from Family f where f.relation='户主' and f.fid = "+ pfId).list();
		if(list !=null && list.size()>0){
			return list.get(0);
		}
		return null;
	}

}
